iT邦幫忙

0

sui move 學習 - 購買食材/製作三明治

  • 分享至 

  • xImage
  •  

本身從11月初開始接觸move語言,在比較傳統move與sui move之後,決定從sui move直接學習。
但因為sui move還在開發初期,所以能找到的資料有限,教學基本上是沒有,除了官網,以及最近Buildler DAO的代幣生成的教程,學習資源不多,所以自己也爬文爬來爬去,透過官網及零湊的資料做學習。
本身對程式語言只有一點點基礎,加上英文不好,學習起來蠻吃力的。
如果大家有興趣,歡迎一起來研究,目前臺灣這方面的資源極少。
若是想學習aptos move語言,也就是原先的move,目前已經有不少大神已開發出教程,有興趣的可以底下留言,我在提供連結。

---前言---
這篇沒有教如何搭載編譯環境,有興趣可以到官網去看。
若有問題,歡迎私訊。

---進入正題--- (我有開始撰寫教程,可以前往我的發文)
以下這個三明治組合製作,是我爬到一位大神所發表的文章,他的文章是9月底的時候發的,中間應該因為經過多次改版,所以編碼有許多地方有變動,這邊我附上原文,以及我修改後的版本,提供參考學習,他的文章很好,記得詳閱。
原文:https://medium.com/dsrv/my-first-impression-of-sui-move-1-introduction-minting-a-simple-nft-f8e27941446e
簡中:https://learnblockchain.cn/article/4812

建議先看他的教學,照著他的程式碼完成一次,再來我這邊做比較,尋找修改的地方。
以下我就不詳細講太多東西,可以比較看看修改了哪些地方,因為不知道有沒有人看,有需要再提問XD 。

module sandwich::shop {
    use sui::object::{Self,UID};
    use sui::tx_context::{Self, TxContext};
    use sui::transfer;
    use sui::balance::{Self, Balance};
    use sui::sui::SUI;
    use sui::coin::{Self, Coin};
    
    struct Ham has key { id:UID }
    struct Bread has key { id:UID }
    struct Sandwich has key { id:UID }
    struct GroceryOwnerCapability has key { id:UID }
    struct Grocery has key { id:UID, profits:Balance<SUI> }

    const HAM_PRICE: u64 = 10;
    const BREAD_PRICE: u64 = 2;
    const EInsufficientFunds: u64 = 0;
    const ENoProfits: u64 = 1;

    fun init(ctx: &mut TxContext) {
        transfer::share_object(Grocery{id:object::new(ctx), 
        profits:balance::zero<SUI>()});
        transfer::transfer(GroceryOwnerCapability{id:object::new(ctx)}, 
        tx_context::sender(ctx));
    }

    public entry fun buy_ham(grocery: &mut Grocery,c: Coin<SUI>,ctx: &mut TxContext) {
        let b = coin::into_balance(c);
        assert!(balance::value(&b) == HAM_PRICE, EInsufficientFunds);
        balance::join(&mut grocery.profits, b);
        transfer::transfer( Ham{id: object::new(ctx)}, tx_context::sender(ctx))
    }

    public entry fun buy_bread (grocery: &mut Grocery,c: Coin<SUI>,ctx: &mut TxContext) 
    {
        let b = coin::into_balance(c);
        assert!(balance::value(&b) == BREAD_PRICE, EInsufficientFunds);
        balance::join( &mut grocery.profits, b);
        transfer::transfer(Bread {id: object::new(ctx)}, tx_context::sender(ctx))
    }

    public entry fun make_sandwish(ham:Ham, bread:Bread, ctx: &mut TxContext) {
        let Ham { id: ham_id } = ham;
        let Bread { id:bread_id } = bread;
        object::delete(ham_id);
        object::delete(bread_id);
        transfer::transfer(Sandwich{id: object::new(ctx)}, tx_context::sender(ctx))
    }

    public fun profits(grocery: &Grocery): u64 {
        balance::value( & grocery.profits)
    }

    public entry fun collect_profits(_cap: & GroceryOwnerCapability, 
        grocery: &mut Grocery, ctx: &mut TxContext) {
        let amount = balance::value( & grocery.profits);
        assert!(amount > 0, ENoProfits);
        let coin = coin::take( &mut grocery.profits, amount, ctx);
        transfer::transfer(coin, tx_context::sender(ctx));
    }

    #[test_only]
    public fun init_for_testing(ctx: &mut TxContext){
        transfer::share_object(Grocery{id:object::new(ctx), profits:balance::zero<SUI>
        ()});
        transfer::transfer(GroceryOwnerCapability 
        {id:object::new(ctx)},tx_context::sender(ctx));
    }
}

#[test_only]
module sandwich::test_sandwish {
    use sandwich::shop::{Self,Grocery,GroceryOwnerCapability,Bread,Ham};
    use sui::test_scenario;
    use sui::coin;
    use sui::sui::SUI;

    #[test]
    fun test_make_sandwish() {
        let owner = @0x1;
        let the_guy = @0x2;

        let scenario_val = test_scenario::begin(owner);
        let scenario = &mut scenario_val;
        test_scenario::next_tx(scenario, owner); {
            shop::init_for_testing(test_scenario::ctx(scenario));
        };

        test_scenario::next_tx(scenario, the_guy); {
            let grocery_wrapper = test_scenario::take_shared<Grocery>(scenario);
            let ctx = test_scenario::ctx(scenario);

            shop::buy_ham(&mut grocery_wrapper, coin::mint_for_testing<SUI>(10, ctx),ctx);
            shop::buy_bread(&mut grocery_wrapper, coin::mint_for_testing<SUI>(2, ctx),ctx);

            test_scenario::return_shared(grocery_wrapper);
        };
        
        test_scenario::next_tx(scenario, the_guy); {
            let ham = test_scenario::take_from_address<Ham>(scenario, the_guy);
            let bread = test_scenario::take_from_address<Bread>(scenario, the_guy);
            shop::make_sandwish(ham, bread, test_scenario::ctx(scenario));
        };

        test_scenario::next_tx(scenario, owner); {
            let grocery_wrapper = test_scenario::take_shared<Grocery>(scenario);
            let grocery = &mut grocery_wrapper;
            let capability = test_scenario::take_from_address< GroceryOwnerCapability>(scenario, owner);

            assert!(shop::profits(grocery) == 12,0);
            shop::collect_profits( &capability, grocery,test_scenario::ctx(scenario));
            assert!(shop::profits(grocery)==0, 0);

            test_scenario::return_to_sender(scenario, capability);
            test_scenario::return_shared(grocery_wrapper);
            
        };
        test_scenario::end(scenario_val);
    }
}   

另外關於init初始化權限這部分,為什麼init for test不直接寫入init(ctx),是因為目前0.16版本,官方為了防止測試有問題,所以暫時關閉了init的測試功能,如果使用之後去test,系統會報錯,所以把init的編碼直接搬到init for test裡。


圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
海綿寶寶
iT邦大神 1 級 ‧ 2022-11-25 09:57:47

請教一個愚蠢的問題
學會 sui move 可以寫什麼
/images/emoticon/emoticon19.gif

可以簡單回覆
專有名詞(eg.Smart Contract...)我再去Google就好

我對虛擬貨幣完全外行(只聽過「去中心化」「比特幣」「以太幣」)
看了您這篇文章
才去Google了 sui move
/images/emoticon/emoticon25.gif

Dan_K iT邦新手 5 級 ‧ 2022-11-25 10:09:26 檢舉

您好,是寫智能合約唷~
去中心主要是建構在[以太坊]這樣的區塊鏈平台上,在以太坊上可以建構許多Dapp,如前陣子很紅的NFT交易平台opensea就是以太坊上的項目(Dapp)之一,這些平台上的項目,後端都是透過智能合約去寫的。
不過目前區塊鏈都是用「solidity」的程式語言去寫的,而move是FB(Meta)原本團隊所另外開發的智能合約語言。
後來團隊拆了,裡面一些人出來創立sui區塊平台,他們針對move進行優化,開發了sui move這樣的特有程式語言。

簡單講是這樣,哈哈~
可能可以先去了解區塊鏈的架構及應用,會比較理解!

有點概念了
/images/emoticon/emoticon41.gif/images/emoticon/emoticon41.gif/images/emoticon/emoticon41.gif

Dan_K iT邦新手 5 級 ‧ 2022-12-02 00:09:11 檢舉

如果對區塊鏈有興趣,想多了解,歡迎可以到我創的line社群唷,我有把連結放在下一篇文章中。

我要留言

立即登入留言